Welcome to pandas!

4.3 替换、拆分匹配成功的值

1、在正则表达式中,可以对匹配成功的的字符串进行替换处理,既可以替换为普通字符串, 也可以是有特殊字符的正则表达式,还可以是函数。

(1)普通替换

(2)正则表达式中分组的替换

(3)替换时函数用法


import re

text= "小张34小明16欧阳大明45小曾32"

t1=re.sub( "\d+","、" ,text)

t2=re.sub( "(\d+)" ,r "\1、" ,text)

#只有一个分组,所以只写个\1

t3=re.sub( "\d+" , lambda m:m[0]+ "、" ,text)

#第一个m相当限返回一个match对象,m[0]表标获取里面的值

print (t1)

print (t2)

print (t3)

返回:

小张、小明、欧阳大明、小曾、

小张34、小明16、欧阳大明45、小曾32、

小张34、小明16、欧阳大明45、小曾32、


2、拆分匹配成功的值

在python中虽然可以使用split()函数执行拆分,但没有正则表达式中的split()函数灵活,使用正则表达式拆分函数返回的是列表

正则表达式字符串就是拆分的分隔符,如果在正则表达式字符串捕获到有使用括号进行分组,那么所有的分组里的内容也会返回到列表里。


import re

text= "小张34-小明16-欧阳大明45-小曾32"

txt= "小张34小明16欧阳大明45小曾32"

t1=text.split( "-" )

t2=re.split( "\d+" ,txt)

t3=re.split( "(\d+)" ,txt)

t4=re.compile( "(\d+)" ).split(txt,2)

print (t1)

print (t2)

print (t3)

print (t4)

返回:

['小张34', '小明16', '欧阳大明45', '小曾32']

['小张', '小明', '欧阳大明', '小曾', '']

['小张', '34', '小明', '16', '欧阳大明', '45', '小曾', '32', '']

['小张', '34', '小明', '16', '欧阳大明45小曾32']


3、编译正则表达式

Re.compile()函数用于编译正则表达式,它将正则表达式转化为对象,生成一个re.Patten对象

关于re.compile函数参数说明如下

Re.compile(patten[,flags])

Patten:一个字符串的正则表达式

Flags:可选,可匹配模式,比如忽略大小写,多行模式等,默认参考为re.unicode

可是使用字符“|”表时同时生效,也可以在正则表达式字符串中指定,re.patten对象不能直接实例化, 只能通过compile()函数得到。

完整写法 简写 内联标记 注释
Re.ASCII re.A (?a) 表示\w、\W、\b、\B、\d、\D、\s、\S只匹配ASCII而不是unicode,区配256个字符,但不包括汉字
Re.unicode re.U (?u) 表示\w、\W、\b、\B、\d、\D、\s、\S依赖于unicode字符库
Re.ignorecase ire.l (?i) 进行大小写忽略匹配,比如表达式中匹配小写字母,但实际也会匹配大写字母
Re.multiline re.M (?m) 多行模式,”^”匹配整个字符串的开始,和每一行开始,$匹配整个字符串结尾,和每一行结尾
Re.dotall re.S (?s) 让“.”特殊字符匹配任何字符,包括换行符,如没有此标记,“.”就匹配换行符的其他任意字符
Re.verbose re.X (?x) 允许编写更具可读性更友好的正则表达式,忽略空格和#后面的注释。

4、特殊斜杠

\是一个具有特殊用法的的普通符号,常见用法如下

(1)在普通字符串中表现特殊的空白字符

\t 模向制表符
\n 换行符
\r 回车符
\f 换页符
\v 纵向制表符

(2)在普通字符串中表现特殊的空白字符

如果要还原为\原本的字符效果,则再在\前再添加\,表示:\\

(3)也可以在字符串左则添加r实现批量转换

(4)在正则表达式字符串中添加“\”,达到转换为特殊字符,或者将具有特殊作用的字符转为普通字符。

4、单字符(元字符)

匹配字符 注释
\d 匹配数字,相当于[0-9]
\D 匹配任何非数字的字符,与\d相反,相当于[^0-9]
\w 匹配unicode字符,包括数字和下划线,如果设置为ASCII模式就只匹配[a-zA-Z0-9]
\W 匹配非unicode字符,与\w相反,如果设置为ASCII模式就只匹配[^a-zA-Z0-9]
\s 匹任何unicode空白字符,如果设置为ASCII模式就只匹配[\t\n\r\f\v]
\S 匹任何unicode非空白字符,如果设置为ASCII就相当于[^\t\n\r\f\v]•(点)在默认情况下, 匹配除换行之外的任意字符。如果设置为re.dotall模式,它将匹配包括换行符的任意字符。


5、单字符(单字符或关系)

字符组的字符个数为1,字符组在一对中括号([…])中存放单个或多个需要匹配的字符, 也可以指定一段字符范围,之符之间为或的逻辑关系。

字符组常见匹配方式 注释
[0-9] 匹配所有数字
[a-z] 匹配所有小写字母
[A-Z] 匹配所有大写字母
[a-zA-Z] 匹配所有大小写字母
[一-龥]或[\u4e00-\u9fa5] 匹配所有汉字,龥(打字码rtt)
[\d\w] 匹配存放在字符组中的元字符
[^……] 匹配非汉字,如[^一-龥]
| 逻辑或匹配,如a|d|n,表示只匹配这3个字母;
|之间与可是表达式

import re

text= "小张34-小明16-欧阳一大明45-小曾32"

t=re.compile( "[一-龥]" )

p=t.findall(text)

print (p)

返回:

['小', '张', '小', '明', '欧', '阳', '一', '大', '明', '小', '曾']